package cn.bearspark.user.provider.service;

import cn.bearspark.common.dto.ResponseDTO;
import cn.bearspark.user.dto.LoginRespDTO;
import cn.bearspark.user.dto.UserBaseInfoDTO;
import cn.bearspark.user.dto.UserSimpleDTO;
import cn.bearspark.user.dto.UserSlimDTO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户基础数据的相关服务接口
 *
 * @author f
 */
public interface UserBaseService {

    /**
     * 初始化密码，同时需要初始化用户的基础信息
     *
     * @param phone    手机号
     * @param password 密码
     * @return 初始化密码的结果
     */
    ResponseDTO<Object> initPassword(String phone, String password);

    /**
     * 修改密码
     *
     * @param phone    手机号
     * @param password 密码
     * @return 修改密码的结果
     */
    ResponseDTO<Object> modifyPassword(String phone, String password);

    /**
     * 用户登录
     *
     * @param phone    手机号
     * @param password 密码
     * @return 用户登录的响应对象
     */
    ResponseDTO<LoginRespDTO> login(String phone, String password);

    /**
     * 查询指定用户的用户基础信息
     *
     * @param id 用户的 id
     * @return 用户的基础信息
     */
    UserBaseInfoDTO getBaseInfo(long id);

    /**
     * 根据用户的 id 获取其关注者的简要信息，最多有 1000 个最近活跃时间的关注者
     *
     * @param userId 指定的用户 id
     * @return 指定用户的关注者的简要信息
     */
    List<UserSimpleDTO> listFSimpleInfo(long userId);

    /**
     * 获取指定用户的所有关注者的用户最简信息
     *
     * @param userId 指定的用户 id
     * @return 指定用户的所有关注者的用户最简信息集合
     */
    List<UserSlimDTO> listFSlimInfo(long userId);

    /**
     * 获取指定用户的所有关注者的用户最简信息
     * <p>
     * 注意：本方法只会返回动态数不为 0 的用户
     *
     * @param userId 指定的用户 id
     * @return 指定用户的所有关注者的用户最简信息集合
     */
    List<UserSlimDTO> listFSlimInfoWithHappening(long userId);

    /**
     * 获取指定用户的最简信息
     *
     * @param userId 指定的用户 id
     * @return 指定用户的最简信息
     */
    UserSlimDTO getSlimInfo(long userId);

    /**
     * 查询指定用户的最简信息
     *
     * @param userIdSet 指定的用户 id 的 Set 集合
     * @return 指定用户的最简信息映射，key：用户 id，value：用户最简信息
     */
    Map<Long, UserSlimDTO> mapSlimInfo(Set<Long> userIdSet);

    /**
     * 根据用户的 id 获取他和部分关注者的最简信息，最多有 1000 个最近活跃时间的关注者
     * <p>
     * 注意：本方法只会返回动态数不为 0 的用户
     *
     * @param userId 指定的用户 id
     * @return 指定用户的最简信息映射，key：用户 id，value：用户最简信息
     */
    Map<Long, UserSlimDTO> mapSAFSlimInfoWithHappening(long userId);

    /**
     * 获取粉丝的用户 id 集合
     *
     * @param userId 待获取粉丝 id 的用户的 id
     * @return 粉丝的用户 id 集合
     */
    List<Long> listFansId(long userId);

    /**
     * 获取指定用户发布的动态数
     *
     * @param userId 指定的用户 id
     * @return 指定用户发布的动态数
     */
    long getHappeningNumByUserId(long userId);

    /**
     * 获取用户 id 与用户名的映射
     *
     * @param userIdSet 待查询的用户 id 集合
     * @return 用户 id 与用户名的映射，key：用户 id，value：用户名
     */
    Map<Long, String> mapUsername(Set<Long> userIdSet);
}
